<?php
/*
 * 최초작성일 	: 2008. 08. 18
 * 작성자 	: 조성훈 (akdddnet@gmail.com)
 *
 * 수정내역	
 * 		1. 2010. 12. 30
 * 			- IMessenger 사용안함. 
 */
 	
 	require_once __DIR__."/../utility/Common.php";
 	
 	/**
 	 * File class
 	 */
	class Files extends Exception 
	{
		protected $fileName;
		protected $fileSize;
		protected $fileType;
		protected $fileExt;
		protected $filePath;
		protected $data;
		protected $dateFileWrite;
		
		public function __construct($filePath=null)
		{
			$this->fileName = null;
			$this->fileSize = '0 Byte';
			$this->fileType = null;
			$this->fileExt = null;
			$this->data = null;
			
			// 경로를 따로 지정하지 않았을 경우에는 document_root로 셋팅
			if(is_null($filePath))
				$this->filePath = $_SERVER['DOCUMENT_ROOT'].'/';
			else $this->filePath = $filePath;
		}
		
		
		public function setFilePath($strPath)
		{
			$this->filePath = $strPath;	
		}
		
		/**
		 * 타겟이 될 파일을 셋팅합니다.
		 * 수정 반드시 필요~ ㅠ
		 * @param string $fileName : 파일명
		 * @return void;
		 */
		public function setFile($fileName)
		{		
			if(Common::isNullOrEmpty($fileName))
			{
				throw new Exception('파일명을 입력해주세요.');
			}
			else 
			{
				$this->fileName = $fileName;
				
				$strFileFullPath = $this->filePath.$this->fileName;
				if($this->isExists($strFileFullPath))
				{
					$this->fileSize = Common::getFileSize(filesize($strFileFullPath));
					$this->fileExt = $this->getExtention($strFileFullPath);
					$this->fileType = filetype($strFileFullPath);
					$this->dateFileWrite = date('Y년 m월 d일 H시 i분 s초.', fileatime($strFileFullPath));
				}
				else 
				{
					throw new Exception('파일이 존재하지 않습니다.');	
				}
			}
		}
		
		public function getFileSize()
		{
			return $this->fileSize;	
		}
		
		public function getFileExt()
		{
			return $this->fileExt;	
		}
		
		public function getFileDate()
		{
			return $this->dateFileWrite;	
		}
		
		public function getFileType()
		{
			return $this->fileType;	
		}
		
		public function getExtention($file)
		{
			if(is_null($file))
				return strtolower(array_pop(explode('.',$this->fileName))); 
			else
				return strtolower(array_pop(explode('.',$file)));	
		}
		
		
		/**
		 * 해당 파일의 내용을 가져옵니다.
		 * 
		 * @param string $fileName : 파일명
		 * @param string $encode : 인코딩
		 * @param bool $isHTML : html형식으로 출력
		 * @return string $content;
		 */
		public function getFileContent($fileName, $encode='UTF-8', $isHTML = true)
		{
			$this->fileName = $fileName;
			
			$content = file_get_contents($this->filePath."/".$this->fileName, $encode);
			
			if($isHTML)
				$content = str_replace('\r\n', '<br/>', $content);
				
			return $content;
		}
		
		
		/**
		 * 현재 클래스에 설정된 변수 값을 출력합니다.
		 */
		public function debug()
		{
			echo '<br/>파일명 : '.$this->fileName.'<br/>';
			echo '파일 사이즈 : '.$this->fileSize.'<br/>';
			echo '파일 타입 : '.$this->fileType.'<br/>';
			echo '파일 확장자 : '.$this->fileExt.'<br/>';
			echo '입력 Data : '.$this->data.'<br/>';
			echo '파일 경로 : '.$this->filePath.'<br/>';
			echo '파일 작성 및 수정일 : '.$this->dateFileWrite.'<br/>';
		}
		
		/**
		 * 해당 파일에 입력받은 string을 작성합니다.
		 * 
		 * @param string $fileName : 파일명
		 * @param string $data : 입력할 string
		 * @param bool $isOverwrite : 덮어씌기 사용여부(false일경우 파일이 존재할경우 false를 리턴)
		 * @param bool $isLog : 로그전용(PHP_EOL 때문에)
		 * @return IMessenger $mesg;
		 */
		public function writeFile($fileName=null, $data=null, $isOverwrite=true, $isLog=false)
		{
			if(Common::isNullOrEmpty($fileName))
			{
				throw new Exception('파일명을 입력해주십시요.');
			}
			else 
			{
				$this->fileName = $fileName;

				$strFileFullPath = $this->filePath."/".$this->fileName;
			
				if(!Common::isNullOrEmpty($data))
				{
					// Log 전용이라면 PHP_EOL을 사용하면 안됨
					if(!$isLog)
						$this->data = $data.PHP_EOL;
					
					/** FileOpenMode 정리
					 * r 	: 파일 읽기 모드, 포인터는 파일의 처음
					 * r+ 	: 파일을 읽기 및 쓰기 모드, 포인터는 파일의 처음
					 * w	: 파일을 읽기 쓰기 모드, 파일이 존재하면 기존의 내용을 지우고 그위에 새로운 내용을 덮어씌운다. 
					 * 		  존재하지않을 경우 새로 파일을 생성, 포인터는 처음
					 * w+ 	: 읽기 쓰기 모드 이외에는 w와 동일
					 * a	: 파일을 쓰기 모드로 연다, 파일이 존재하지 않으면 새로 생성, 포인터는 마지막에 위치
					 * a+	: 읽기 쓰기 모드 이외에는 a와 동일
					 * x	: 파일을 생성하고 쓰기 모드로 연다, 파일이 존재하면 false
					 * x+	: 읽기 쓰기 모드 이외에는 x와 동일
					 */
					$fileOpenMode = 'a';
					
					// 기존 파일이 존재하고, 덮어씌기를 사용하지 않을 경우에는 경고
					if(!$isOverwrite && $this->IsExists($strFileFullPath))
					{
						throw new Exception('파일이 존재하거나, 덮어씌기가 금지되어있습니다.');
					}
					else 
					{
						try
						{
							$handle = fopen($strFileFullPath, 'a');
							$lock = flock($handle, 2);
							if($lock)
							{
								if(false === @fwrite($handle, $this->data))
								{
									throw new Exception('stream에 쓸수 없습니다.');
								}
							}
							flock($handle, 3);
							fclose($handle);
						}	
						catch(Exception $e)
						{
							throw new Exception($e);	
						}
					}
				}
			}
		} 
		
		/**
		 * 파일이 존재하는지 확인 합니다.
		 * 존재할 경우 true, 존재 하지 않을 경우 false
		 * @param string $fileName : 파일명
		 * @return bool 
		 */
		public function isExists($fileName = null)
		{
			//if(!is_null($fileName))
				//$this->fileName = $fileName;
			if(file_exists($fileName))
				return true;
			else return false;
				
		}
		
		
		public function cp($destination=null)
		{
			/*
			$mesg = new MessengerImple();
			if(is_null($destination))
			{
				$mesg->ProcessCode('350');
				$mesg->ProcessMessage('복사할 경로가 입력되지 않았습니다.');
			}
			else 
			{
				copy($this->	
			}
			*/
		}
		
		public function rm($fileName)
		{
			
		}
		
		public function mv($fileName, $destination=null)
		{
			
		}
		
		
		
	}
?>
